home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Mac Game Programming Gurus
/
TricksOfTheMacGameProgrammingGurus.iso
/
More Source
/
C⁄C++
/
AsychSound
/
AsynchSound.c
next >
Wrap
Text File
|
1994-11-09
|
2KB
|
66 lines
void
PlaySoundFile(FSSpec *fss)
{
OSErr err;
short refNum;
ulong srcSize;
HParamBlockRec pb;
Handle sndHandle;
ulong maxblock = MaxBlock() - (32 * 1024);
short id;
long type;
Str255 name;
SCStatus status;
if (SndNewChannel(&sndChannel, sampledSynth, 0, nil) != noErr) {
SysBeep(1);
return;
}
SetResLoad(false);
if ((refNum = HOpenResFile(fss->vRefNum, fss->parID,
fss->name, fsRdPerm)) == -1) {
SysBeep(1);
return;
}
sndHandle = Get1IndResource('snd ', 1);
if (sndHandle == nil) {
SysBeep(1);
return;
}
GetResInfo(sndHandle, &id, &type, name);
srcSize = MaxSizeRsrc(sndHandle);
SetResLoad(true);
if (srcSize < maxblock) {
dataHandle = Get1Resource('snd ', id);
DetachResource(dataHandle);
HLock(dataHandle);
} else {
dataHandle = TempNewHandle(srcSize, &err);
if (dataHandle == nil) {
SysBeep(1);
return;
}
HLock(dataHandle);
ReadPartialResource(sndHandle, 0, *dataHandle, srcSize);
if (ResError() != noErr)
Debugger();
}
CloseResFile(refNum);
SndPlay(sndChannel, dataHandle, true);
do {
WasteTime(15);
SndChannelStatus(sndChannel, sizeof(SCStatus), &status);
} while (status.scChannelBusy == true);
SndDisposeChannel(sndChannel, true);
sndChannel = nil;
quitting = true;
DisposeHandle(dataHandle);
dataHandle = nil;
}